Problem
【LNOI2014】LCA
Description
给出一个个节点的有根树(编号为到,根节点为)。一个点的深度定义为。设表示点的深度,表示与的最近公共祖先。
有次询问,每次询问给出,求。
Input
第一行个整数。
接下来行,分别表示点到点的父节点编号。
接下来行,每行个整数。
Output
Sample Input
1 | 5 2 |
Sample Output
1 | 8 |
HINT
共组数据,与的规模分别为,,,,。
Source
数据已加强saffah
标签:树链剖分
Solution
傻逼树链剖分,练手居然还了一发…
首先有一个这样的暴力:对于每个询问,将到根的路径打标记,枚举,每次累加当前节点最近的标记节点的深度。
然后发现可以反转一下:对于每个询问,枚举,每次将当前结点到根路径上的所有结点权值,统计到根路径上的总权值即可。(权值相当于深度累加)。
这道题没有强制在线,于是可以把所有的询问都离线下来,拆成两个前缀询问和分别计算。如果将所有前缀询问按右端点位置排序,不难发现可以依次操作,每次将一个新的结点到根路径上的所有结点权值,操作完统计右端点在此结点上的所有前缀询问的答案。
注意模完两个前缀答案相减后可能出现负数,需要先加上。
Code
1 |
|